//
//  RZMessageBaseCell.h
//  RZIM
//
//  Created by reyzhang on 2021/8/19.
//

#import <UIKit/UIKit.h>
#import "RZMessageInfo.h"
#import "RZIMConfig.h"
#import "RZKitUtility.h"
#import "RZKitCommonDefine.h"

NS_ASSUME_NONNULL_BEGIN

#define TIME_LABEL_HEIGHT 16
#define TIME_LABEL_AND_BASE_CONTENT_VIEW_SPACE 12
#define TIME_LABEL_TOP 8
#define BASE_CONTENT_VIEW_BOTTOM 20 //每个 Cell 底部都有 20 个点


@class RZMessageBaseCell,RZMessageInfo;
/*!
 消息Cell点击的回调
 */
@protocol RZMessageCellDelegate <NSObject>
@optional

/*!
 点击Cell内容的回调

 @param model 消息Cell的数据模型
 */
- (void)didTapMessageCell:(RZMessageInfo *)model;

/*!
 点击Cell中URL的回调

 @param url   点击的URL
 @param model 消息Cell的数据模型

 @discussion 点击Cell中的URL，会调用此回调，不会再触发didTapMessageCell:。
 */
- (void)didTapUrlInMessageCell:(NSString *)url model:(RZMessageInfo *)model;

/*!
 点击撤回消息Cell中重新编辑的回调

 @param model 消息Cell的数据模型

 @discussion 点击撤回消息Cell中重新编辑，会调用此回调，不会再触发didTapMessageCell:。
 */
- (void)didTapReedit:(RZMessageInfo *)model;

/*!
 点击Cell中电话号码的回调

 @param phoneNumber 点击的电话号码
 @param model       消息Cell的数据模型

 @discussion 点击Cell中的电话号码，会调用此回调，不会再触发didTapMessageCell:。
 */
- (void)didTapPhoneNumberInMessageCell:(NSString *)phoneNumber model:(RZMessageInfo *)model;

/*!
 点击Cell中用户头像的回调

 @param userId 头像对应的用户ID
 */
- (void)didTapCellPortrait:(NSString *)userId;

/*!
 长按Cell中用户头像的回调

 @param userId 头像对应的用户ID
 */
- (void)didLongPressCellPortrait:(NSString *)userId;

/*!
 长按Cell内容的回调

 @param model 消息Cell的数据模型
 @param view  长按区域的View
 */
- (void)didLongTouchMessageCell:(RZMessageInfo *)model inView:(UIView *)view;

@end


@interface RZMessageBaseCell : UICollectionViewCell
@property (nonatomic, strong) RZMessageInfo *model;
/*!
 消息Cell点击回调
 */
@property (nonatomic, weak) id<RZMessageCellDelegate> delegate;




/*!
 Cell显示的View
 */
@property (strong, nonatomic) UIView *baseContentView;

/*!
 自定义消息Cell的Size

 @param model               要显示的消息model
 @param collectionViewWidth cell所在的collectionView的宽度
 @param extraHeight         cell内容区域之外的高度

 @return 自定义消息Cell的Size

 @discussion 当应用自定义消息时，必须实现该方法来返回cell的Size。
 其中，extraHeight是Cell根据界面上下文，需要额外显示的高度（比如时间、用户名的高度等）。
 一般而言，Cell的高度应该是内容显示的高度再加上extraHeight的高度。
 */
+ (CGSize)sizeForMessageModel:(RZMessageInfo *)model
      withCollectionViewWidth:(CGFloat)collectionViewWidth
         referenceExtraHeight:(CGFloat)extraHeight;

/*!
 设置当前消息Cell的数据模型

 @param model 消息Cell的数据模型
 */
- (void)setDataModel:(RZMessageInfo *)model;


/**
 工厂方法创建具体对象
 */
+ (instancetype)createInstanceWithCollectionView:(UICollectionView *)collectionView
                                      forMessage:(RZMessageInfo *)message
                                     atIndexPath:(NSIndexPath *)indexPath;


@end

NS_ASSUME_NONNULL_END
